/**
 * 
 */
package com.xpec.c4.game.datamanager.agent.money;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.xpec.c4.game.common.Helper;

/**
 * 透過 dc 要求變更玩家金錢的幣別容器
 * 
 * @author TW15010
 */
public class ChangeCoinLister implements Serializable {
	private static final long serialVersionUID = -189279348725684013L;

	/**
	 * 幣別容器
	 */
	private HashMap<CoinType, ChangeCoin> coinMap = new HashMap<CoinType, ChangeCoin>();
	
	/**
	 * 加入一個幣別
	 * 
	 * @param coinType
	 *            幣別
	 * @param changeValue
	 *            異動值，必須為大於零的值
	 * @return 成功: true<br>
	 *         失敗: false
	 */
	public boolean addCoin(CoinType coinType, BigDecimal changeValue) {
		if (Helper.isLessEqual(changeValue, BigDecimal.ZERO)) {
			return false;
		}

		ChangeCoin changeCoin;

		// 如果沒有加過這個幣別就新增
		if (!coinMap.containsKey(coinType)) {
			changeCoin = new ChangeCoin();
			coinMap.put(coinType, changeCoin);
		} else { // 有的話就累加進去
			changeCoin = coinMap.get(coinType);
		}

		changeCoin.setCoinType(coinType);
		changeCoin.setChangeValue(Helper.add(changeCoin.getChangeValue(), changeValue));

		return true;
	}

	/**
	 * 取得指定幣別的資訊
	 * 
	 * @param coinType
	 * @return 成功：幣別資訊<br>
	 *         失敗：null
	 */
	// public ChangeCoin getCoin(CoinType coinType) {
	// return coinMap.get(coinType);
	// }

	/**
	 * 取得幣別類型清單
	 * 
	 * @return 類型清單
	 */
	// public Set<CoinType> getTypeList() {
	// return coinMap.keySet();
	// }

	/**
	 * 取得幣別數量
	 * 
	 * @return 數量
	 */
	public int getSize() {
		return coinMap.size();
	}

	/**
	 * 取得清單的 Iterator
	 * <p>
	 * 透過 Iterator 向 {@link #getNextCoin(Iterator)} 取得清單內所有的幣別
	 * 
	 * @return Iterator
	 */
	public Iterator<Map.Entry<CoinType, ChangeCoin>> getListIterator() {
		return coinMap.entrySet().iterator();
	}

	/**
	 * 取得容器中的下一個個幣別
	 * <p>
	 * 可以一直呼叫直到傳回 null 為止
	 * 
	 * @param it
	 *            透過 {@link #getListIterator()} 取得
	 * @return
	 */
	public ChangeCoin getNextCoin(Iterator<Map.Entry<CoinType, ChangeCoin>> it) {
		if (it == null) {
			return null;
		}

		if (it.hasNext()) {
			Map.Entry<CoinType, ChangeCoin> entry = it.next();
			return entry.getValue();
		}

		return null;
	}

	public HashMap<CoinType, ChangeCoin> getCoinMap() {
		return coinMap;
	}

	public void setCoinMap(HashMap<CoinType, ChangeCoin> coinMap) {
		this.coinMap = coinMap;
	}
}
